home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / decomp / exec_sq.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-01-23  |  4.3 KB  |  223 lines

  1. # include    <ingres.h>
  2. # include    <aux.h>
  3. # include    <tree.h>
  4. # include    <symbol.h>
  5. # include    <pv.h>
  6. # include    "globs.h"
  7. # include    <sccs.h>
  8.  
  9. SCCSID(@(#)exec_sq.c    8.1    12/31/84)
  10.  
  11. /*
  12. ** DECOMP2 -- Routines for executing detached sub-queries appearing
  13. **    in sqlist. These routines include:
  14. **
  15. **    exec_sq -- execute sub-queries and update range table.
  16. **
  17. **    undo_sq -- restore range table and destroy temp rels.
  18. **
  19. **    reset_sq - restore range table and reset temp rels.
  20. **
  21. **    execsq1 -- call ovqp with subquery.
  22. */
  23. /*
  24. **  EXEC_SQ
  25. **
  26. **    Execute the subqueries in sqlist. Associated with
  27. **    each sub-query is a relation number stored in sqrange.
  28. **    If the sub-query has a non-null target list, the range
  29. **    table is updated to reflect the new range of the relation.
  30. **
  31. **    If any sub-query is false, all subsequent ones are ignored
  32. **    by ovqp and exec_sq returns the var number of the false subquery.
  33. **
  34. **    As a side effect, "disj" is incremented for each disjoint sub-query
  35. **
  36. **    Trace Flags:
  37. **        35
  38. */
  39.  
  40. exec_sq(sqlist, sqrange, disj)
  41. QTREE    *sqlist[];
  42. int    sqrange[];
  43. int    *disj;
  44. {
  45.     register QTREE    *sq;
  46.     register int    i, qualfound;
  47.     extern DESC    *openr1();
  48.  
  49. #    ifdef xDTR1
  50.     if (tTf(35, 0))
  51.         printf("EXEC_SQ--\n");
  52. #    endif
  53.  
  54.     *disj = 0;
  55.  
  56.     for (i = 0; i < MAXRANGE; i++)
  57.     {
  58.         if (sq = sqlist[i])
  59.         {
  60. #            ifdef xDTR1
  61.             if (tTf(35, 1))
  62.                 printf("sq[%d]=%x\n", i, sq);
  63. #            endif
  64.             qualfound = execsq1(sq, i, sqrange[i]);
  65.  
  66. #            ifdef xDTR1
  67.             if (tTf(35, 2))
  68.                 printf("qualfound=%d\n", qualfound);
  69. #            endif
  70.             if (!qualfound)
  71.             {
  72.                 return(i);
  73.             }
  74.             if (sq->left->sym.type != TREE)
  75.             {
  76.                 /*
  77.                 ** Update the range table and open
  78.                 ** the relation's restricted replacement.
  79.                 */
  80.                 new_range(i, sqrange[i]);
  81.                 openr1(i);
  82.             }
  83.             else
  84.             {
  85.                 (*disj)++;
  86.             }
  87.         }
  88.     }
  89.     return (-1);
  90. }
  91. /*
  92. **  UNDO_SQ
  93. **
  94. **    Undo the effects of one variable detachment on
  95. **    the range table. The two parameters "limit" and
  96. **    "maxlimit" describe how far down the list of
  97. **    subqueries were processed.  Maxlimit represents
  98. **    the furthest every attained and limit represents
  99. **    the last variable processed the last time.
  100. **
  101. **    Trace Flags:
  102. **        36
  103. */
  104.  
  105. undo_sq(sqlist, locrang, sqrange, limit, maxlimit, reopen)
  106. QTREE    *sqlist[];
  107. int    locrang[];
  108. int    sqrange[];
  109. int    limit;
  110. int    maxlimit;
  111. int    reopen;
  112. {
  113.     register QTREE    *sq;
  114.     register int    i, lim;
  115.     bool        dstr_flag;
  116.  
  117. #    ifdef xDTR1
  118.     if (tTf(36, 0))
  119.         printf("UNDO_SQ--\n");
  120. #    endif
  121.  
  122.     initp();    /* setup parm vector for destroys */
  123.     lim = limit == -1 ? MAXRANGE : limit;
  124.     if (maxlimit == -1)
  125.         maxlimit = MAXRANGE;
  126.  
  127.     for (i = 0; i < MAXRANGE; i++)
  128.         if (sq = sqlist[i])
  129.         {
  130.             if (sq->left->sym.type != TREE)
  131.             {
  132.                 if (i < lim)
  133.                 {
  134.                     /* The query was run. Close the temp rel */
  135.                     closer1(i);
  136.                 }
  137.  
  138.                 /* mark the temporary to be destroyed */
  139.                 dstr_mark(sqrange[i]);
  140.                 dstr_flag = TRUE;
  141.  
  142.                 /* reopen the original relation. If maxlimit
  143.                 ** never reached the variable "i" then the
  144.                 ** original relation was never closed and thus
  145.                 ** doesn't need to be reopened.
  146.                 */
  147.                 rstrang(locrang, i);
  148.                 if (reopen && i < maxlimit)
  149.                     openr1(i);
  150.             }
  151.         }
  152.     /* Only call destroy if there's something to destroy */
  153.     if (dstr_flag)
  154.         call_dbu(mdDESTROY, FALSE);
  155.     else
  156.         resetp();
  157.  
  158. }
  159. /*
  160. ** Execsq1 -- call ovqp with mdRETR on temp relation
  161. */
  162.  
  163. execsq1(sq, var, relnum)
  164. QTREE     *sq;
  165. int    var;
  166. int    relnum;
  167. {
  168.     register int    qualfound;
  169.  
  170.     De.de_sourcevar = var;
  171.     De.de_newq = 1;
  172.     qualfound = call_ovqp(sq, mdRETR, relnum);
  173.     return (qualfound);
  174. }
  175. /*
  176. **    Reset each relation until limit.
  177. **    Reset will remove all tuples from the
  178. **    relation but not destroy the relation.
  179. **    The descriptor for the relation will be removed
  180. **    from the cache.
  181. **
  182. **    The original relation is returned to
  183. **    the range table.
  184. **
  185. **    If limit is -1 then all relations are done.
  186. */
  187.  
  188. reset_sq(sqlist, locrang, limit)
  189. QTREE    *sqlist[];
  190. int    locrang[];
  191. int    limit;
  192. {
  193.     register QTREE    *sq;
  194.     register int    i, lim;
  195.     int        old, reset;
  196.     extern char    *rnum_convert();
  197.  
  198.     lim = limit == -1 ? MAXRANGE : limit;
  199.     reset = FALSE;
  200.     initp();
  201.  
  202.     for (i = 0; i < lim; i++)
  203.         if ((sq = sqlist[i]) && sq->left->sym.type != TREE)
  204.         {
  205.             old = new_range(i, locrang[i]);
  206.             setp(PV_STR, rnum_convert(old));
  207.             specclose(old);
  208.             reset = TRUE;
  209.         }
  210.  
  211.     if (reset)
  212.     {
  213.         /*
  214.         ** Guarantee that OVQP will not reuse old
  215.         ** page of relation being reset
  216.         */
  217.         De.de_newr = TRUE;
  218.         call_dbu(mdRESETREL, FALSE);
  219.     }
  220.     else
  221.         resetp();
  222. }
  223.